// POJ1961 Period, SEERC2004
// 刘汝佳
#include <cstdio>
const int NN = 1e6 + 4;
char P[NN];
int F[NN];

int main() {
  for (int n, kase = 1; scanf("%d", &n) == 1 && n; kase++) {
    scanf("%s", P);
    F[0] = 0, F[1] = 0;            // 递推边界初值
    for (int i = 1; i < n; i++) {  // 递推计算失配函数
      int j = F[i];
      while (j && P[i] != P[j]) j = F[j];
      F[i + 1] = (P[i] == P[j] ? j + 1 : 0);
    }
    printf("Test case #%d\n", kase);
    for (int i = 2; i <= n; i++)
      if (F[i] > 0 && i % (i - F[i]) == 0) printf("%d %d\n", i, i / (i - F[i]));
    printf("\n");
  }
  return 0;
}
/*
算法分析请参考: 《入门经典训练指南-升级版》3.3.2节 例题15
*/
// Accepted 485ms 5216kB 632 G++2020-12-14 11:37:15 22208611